#include<iostream>
#include<cstring>
#include<ctime>
#include<cassert>
#include<cerrno>
#include<fcntl.h>
#include<unistd.h>
#include<sys/time.h>

//3. struct_timeval：内核中表示时间的结构体（之一）
int main()
{
    while(true)
    {
        std::cout<<"time:"<<(unsigned long)time(nullptr)<<std::endl;
        struct timeval currtime = {0,0};
        int n = gettimeofday(&currtime,nullptr);
        assert(n==0);
        (void)n;
        std::cout<<"gettimeofday:"<<currtime.tv_sec<<"."<<currtime.tv_usec<<std::endl;
        sleep(1);
    }
}

//2. 非阻塞式IO
//总结：不停的询问内核数据是否准备就绪。
// bool SetNonBlock(int fd)
// {
//     int f1 = fcntl(fd,F_GETFL);//读写的文件描述符几号
//     if(f1<0)
//     {
//         return false;
//     }
//     fcntl(fd,F_SETFL,f1|O_NONBLOCK);//读写操作设置成非阻塞
//     return true;
// }
// int main()
// {
//     SetNonBlock(0);
//     char buffer[1024];
//     while(true)
//     {
//         ssize_t s = read(0,buffer,sizeof(buffer)-1);
//         if(s>0)
//         {
//             buffer[s-1] =0;
//             std::cout<<"echo:"<<buffer<<"-----errno[]"<<errno<<"errstring:"<<strerror(errno)<<std::endl;
//         }
//         else
//         {
//             std::cout<<"read error:"<<errno<<"errstring:"<<strerror(errno)<<std::endl;

//             if(errno = EAGAIN||errno == EWOULDBLOCK)
//             {
//                 std::cout<<"0号文件描述符尚未就绪"<<std::endl;
//                 continue;
//             }
//             else if(errno == EINTR)
//             {
//                 std::cout<<"io信号被中断 等一下再来试试"<<std::endl;
//             }
//             else
//             {

//             }
//         }
//     }
//     return 0;
// }

// //1. 阻塞式IO
// //总结：一旦缓冲区收到信息，就会回显到屏幕中，在没有收到信息的时候会一直等待。
// int main()
// {
//     char buffer[1024];
//     while(true)
//     {
//         ssize_t s = read(0,buffer,sizeof(buffer)-1);
//         if(s>0)
//         {
//             buffer[s-1] =0;
//             std::cout<<"echo:"<<buffer<<"-----errno[]"<<errno<<"errstring:"<<strerror(errno)<<std::endl;
//         }
//         else
//         {
//             std::cout<<"read error:"<<errno<<"errstring:"<<strerror(errno)<<std::endl;
//         }
//     }
// }